<?php

declare(strict_types=1);

namespace app\service;

use app\model\User;
use app\validate\SignupValidate;
use think\Exception;
use think\facade\Session;
use think\exception\ValidateException;

/**
 * 用户注册服务类
 *
 * 处理业务逻辑，执行操作，包括数据验证、用户创建、验证码处理等。
 */
class SignupService
{
    /**
     * 用户注册
     * @param array $data 注册数据
     * @return array
     */
    public function register(array $data): array
    {
        try {
            // 数据验证
            $this->validateInputData($data);

            // 创建用户
            $user = $this->createUser($data);

            return [
                'success'  => true,
                'message'  => '注册成功',
                'data'    => [
                    'user_id'  => $user->id,
                    'username' => $user->username,
                    'email'    => $user->email,
                ],
            ];
        } catch (ValidateException $e) {
            return [
                'success'        => false,
                'message'        => $e->getError(),
                'invalid_fields' => $e->getKey(),
            ];
        } catch (Exception $e) {
            return [
                'success'        => false,
                'message'        => '注册过程中发生未知错误，请稍后再试。',
                'invalid_fields' => []
            ];
        }
    }

    /**
     * 数据验证
     * 
     * 使用 UserValidate 验证器的 'signup' 场景来校验输入数据。
     * 
     * @param array $data 待验证的数据
     * @return void 验证通过则无返回，验证失败则抛出 ValidateException
     * @throws ValidateException 验证失败时抛出
     */
    protected function validateInputData(array $data): void
    {
        // 检查验证码
        $inputCaptcha = $data['captcha'] ?? '';
        if (!captcha_check($inputCaptcha)) {
            throw new ValidateException('验证码错误');
        }

        // 2. 表单数据验证
        validate(SignupValidate::class)->check($data);
    }

    /**
     * 创建用户
     * 
     * @param array $data 已验证的用户数据
     * @return User 创建成功的用户模型实例
     * @throws Exception 如果创建过程中发生错误
     */
    protected function createUser(array $data): User
    {
        $userData = [
            'username' => $data['username'],
            'email'    => $data['email'],
            'password' => $data['password'], // User 模型 setPasswordAttr 处理加密
        ];

        return User::create($userData);
    }
}
